home *** CD-ROM | disk | FTP | other *** search
/ Serving Financial Service…olutions Suite 1994 Fall / Serving Financial Services Solutions Suite 1994 Fall.iso / Apps / Select / ComposeInColor.app / English.lproj / Popi.nib / data.nib (.txt) < prev   
Encoding:
NeXT TypedStream Data  |  1994-12-14  |  32.5 KB  |  636 lines

  1. typedstream
  2. IBObjectData
  3. Object
  4. CustomObject
  5.     Responder
  6. Title
  7.     Helvetica
  8. ScrollView
  9. ClipView
  10. ciifffcfffs
  11. [175c]{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
  12. \margl40
  13. \margr40
  14. \pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\f0\b0\i0\ulnone\fs24\fc0\cf0 new=old
  15. NXCursor
  16. NXImage
  17. NXibeam
  18. Scroller
  19. Control
  20. _doScroller:
  21. @@@ffs
  22.     TextField
  23. TextFieldCell
  24. ActionCell
  25.     Popi code
  26. Matrix
  27. @:@iiii
  28. ButtonCell
  29. NXCachedImageRep
  30. NXImageRep
  31. iisssss
  32. iiiiii
  33. ff@@#::s
  34. Radio
  35. NXradio
  36. NXradioH
  37. Color Channels
  38. Button
  39. Presets
  40. MenuTemplate
  41. *@*@ccc
  42. OtherViews
  43. [13@]
  44. MenuCell
  45.     Variables
  46. Unsharp
  47. Relief
  48. Shrink
  49. Circular
  50.     Transform
  51. Swirl
  52. Swirl2
  53. Radial Blend
  54. Radar Sweep
  55. Spiral
  56. B/W Pattern
  57.     PopUpList
  58. popUp:
  59. NXpulldown
  60. NXpulldownH
  61. Limiter    
  62. NXswitch
  63.     NXswitchH
  64. Parameters
  65. FormCell
  66. Field:
  67. Slider
  68. SliderCell
  69. dddf@d@d
  70. WindowTemplate
  71. iiii***@s@
  72. This window never appears
  73. Window
  74. VThis module implements the popi language for image manipulation by Gerald J. Holzmann.
  75. Helvetica-Oblique
  76. VERSION 1.0
  77. $COPYRIGHT 1992, UNTER ECKER SOFTWARE^
  78. *adapted and extended by Oliver Unter Ecker
  79. CICicon
  80. CIC Popi
  81. Module Help
  82. Panel
  83. [27077c]{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
  84. \margl40
  85. \margr40
  86. {\colortbl;\red0\green0\blue0;}
  87. \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f0\b0\i0\ulnone\fs24\fc1\cf1 POPI(1L)            UNIX Programmer's Manual             POPI(1L)\
  88. NAME\
  89.      popi - perform interactive digital image transformations\
  90. SYNOPSIS\
  91.      popi [option] ... [file] ...\
  92. DESCRIPTION\
  93.      Popi is a program which allows arbitrary transformations to\
  94.      be interactively applied to digital images.  It is based on\
  95.      the program described in "Beyond Photography - The Digital\
  96.      Darkroom" by Gerald J. Holzmann.\
  97.      The meanings of the available command line options are as\
  98.      follows:\
  99.      -V   Print program version identification message and exit.\
  100.      -xWidth\
  101.           Set the image width (number of pixels per scanline) to\
  102.           Width .\
  103.      -yHeight\
  104.           Set the image height (number of scanlines) to Height .\
  105.      -v+  Set the verbose flag on.  Be chatty about a number of\
  106.           things.\
  107.      -v-  Turn the verbose flag off.  Be silent about everything\
  108.           except error messages.\
  109.      -a+  Turn auto-display on.  After each image transformation,\
  110.           the image will be displayed.  Equivalent to the\
  111.           #display + command.\
  112.      -a-  Turn auto-display off.  Equivalent to the #display -\
  113.           command.  Images can still be displayed explicitly with\
  114.           the #display image command.\
  115.      -p[ncpus]\
  116.           On a Sequent multiprocessor, use the specified number\
  117.           of cpus to perform the transform.  If this option is\
  118.           given without a number, the maximum number available is\
  119.           used.  This option has no effect on uniprocessor com-\
  120.           puters.\
  121.      -l[logfile]\
  122.           Enables logging of all input, error messages, and some\
  123.           responses.  Logging is done on the named file, or the\
  124.           file "popi.log" if no name is given.  The #logfile com-\
  125.           mand may also be used to turn logging on and off.\
  126.      An image transform is described by a transform statement.\
  127.      The statement basically takes the form\
  128.              dest = expression\
  129.      where dest indicates the new image and expression describes\
  130.      a transformation.  This statement is executed over the range\
  131.      of image coordinates.  For a 512 x 512 image, it will be\
  132.      executed 262144 times.  An image is normally referenced in a\
  133.      statement by its name and an index.  A cartesian index is\
  134.      specified by using the x and y coordinates in square brack-\
  135.      ets after the image name.  Thus dmr[0,0] is the top left\
  136.      pixel in the image named dmr. Polar coordinates may be\
  137.      specified by giving a radius and angle (in degrees) in curly\
  138.      brackets.  Thus dmr\{0,0\} refers to the centre pixel in the\
  139.      image.  The symbols x and y may appear in the transform\
  140.      statement.  These take on values corresponding to a dif-\
  141.      ferent pixel each time the transform is executed.  Inter-\
  142.      nally the algorithm is as follows\
  143.      for y varying from 0 to Y\
  144.          for x varying from 0 to X\
  145.              execute transform statement\
  146.      where Y is the maximum y coordinate and X is the maximum x\
  147.      coordinate.  The image size can be set on the command line\
  148.      as described later.\
  149.      The value of a pixel varies from 0 to 255 in the current\
  150.      implementation.  Any value outside this range is treated as\
  151.      modulo 256 when being stored in an image (ie. it wraps\
  152.      around).  Low numeric values represent dark colours, while\
  153.      large values represent light colours.  A simple transform\
  154.      statement to set an image to completely black would be\
  155.              new[x,y] = 0        ; set image to black\
  156.      The name new is one of the two default images always main-\
  157.      tained internally.  The other is old. The images referred to\
  158.      by these names are swapped after each operation, so a suc-\
  159.      cession of transforms may modify the "old" image to produce\
  160.      a "new" image.  Thus the statement\
  161.              new[x,y] = old[x,y] / 2      ; darken image\
  162.      will reduce all the pixel intensity values by a half, dark-\
  163.      ening the existing image.  The semicolon (`;') character\
  164.      introduces a comment.  Anything from this to the end of the\
  165.      line is ignored.\
  166.      All the standard arithmetic, relational and boolean opera-\
  167.      tors from the C language are available, with precedence gen-\
  168.      erally as per the C language.  Some additional operators,\
  169.      predefined variables and math functions are also available.\
  170.      Here is a listing of the available symbols and their mean-\
  171.      ings.\
  172.      name Refers to an image name.  If not followed by index\
  173.           brackets, the index [x,y] is assumed.  The currently\
  174.           available names are those shown by the #list display,\
  175.           and also old and new.\
  176.      $n   Where n is a digit, this is an alternative method of\
  177.           referring to an image.  In fact this may be the only\
  178.           method if the image name contains punctuation charac-\
  179.           ters.  The #list command shows the correspondence\
  180.           between image names and this form of reference.\
  181.      X    The maximum x coordinate value.  This is one less than\
  182.           the number of pixels per scanline (image width), which\
  183.           may be set with the -x command line option.\
  184.      Y    The maximum y coordinate value.  This is one less than\
  185.           the number of scanlines (the height of the image),\
  186.           which may be set with the -y command line option.\
  187.      x    The current cartesian x coordinate.  Varies from 0\
  188.           (left of image) to X (right of image).\
  189.      y    The current cartesian y coordinate.  Varies from 0 (top\
  190.           of image) to Y (bottom of image).\
  191.      r    The radius component of the polar coordinate which\
  192.           corresponds to the current cartesian (x,y) coordinate.\
  193.           This is equivalent to sqrt(x*x + y*y) with a transla-\
  194.           tion of the origin.\
  195.      a    The angle component of the polar coordinate which\
  196.           corresponds to the current cartesian (x,y) coordinate.\
  197.           This is equivalent to (and a shorthand for) atan(y/x).\
  198.           Note that the first time in a popi session you use an\
  199.           expression with either r or a in it, you may notice an\
  200.           extra delay before the image transformation begins.\
  201.           This is due to precalculation of an array of polar\
  202.           coordinates that happens the first time you use one.\
  203.      R    The maximum radius value of a polar coordinate.\
  204.      A    The maximum angle value of a polar coordinate (this is\
  205.           just 360).\
  206.      Z    The maximum intensity value of a pixel (corresponding\
  207.           to white).  Currently, this is always 255.\
  208.      **   The exponentiation (raise to the power) operator.  The\
  209.           expression x ** 2 means x squared (x * x).\
  210.      *    The multiplication operator.  This has a higher pre-\
  211.           cedence than division to avoid underflow in expressions\
  212.           with multiplication and division, since normally\
  213.           expressions are evaluated as integers.\
  214.      /    Integer division.  If the divisor is 0, the result is\
  215.           set to Z.\
  216.      %    Modulo.  If the divisor (right hand operand) is 0, the\
  217.           result is set to 0.\
  218.      +    Addition.\
  219.      -    Subtraction.  This may be a unary or a binary operator.\
  220.      <<   Left shift.  The left operand is shifted left the\
  221.           number of bits specified by the right operand.\
  222.      >>   Right shift.  The left operand is shifted right the\
  223.           number of bits specified by the right operand.\
  224.      >    Greater than.  As with all the relational operators, if\
  225.           the specified relation between the operands is true,\
  226.           the result is 1, otherwise the result is 0.\
  227.      <    Less than.\
  228.      >=   Greater than or equal to.\
  229.      <=   Less than or equal to.\
  230.      ==   Test for equality.\
  231.      !=   Not equal to.\
  232.      &    Bitwise (arithmetic) AND operator.\
  233.      ^    Bitwise exclusive OR (XOR) operator.\
  234.      |    Bitwise (arithmetic) OR operator.\
  235.      &&   Logical AND operator.  The result is 1 if both of the\
  236.           operands are true (non-zero); otherwise the result is\
  237.           0.  Unlike the && operator of the C language, this\
  238.           operator is currently not conditional.  Both operands\
  239.           are always evaluated.\
  240.      ||   Logical OR operator.  The result is 1 if both either\
  241.           (or both) of the operands are true (non-zero); other-\
  242.           wise the result is 0.  Unlike the || operator of the C\
  243.           language, this operator is currently not conditional.\
  244.           Both operands are always evaluated.\
  245.      sin(expr)\
  246.           This gives the value of the trigonometric sine of the\
  247.           expression, multiplied by Z.  This is required because\
  248.           all operations are performed with integers.\
  249.      cos(expr)\
  250.           This gives the value of the trigonometric cosine of the\
  251.           expression, multiplied by Z.  This is required because\
  252.           all operations are performed with integers.\
  253.      atan(y-expr,x-expr)\
  254.           This returns the trigonometric arctangent (inverse\
  255.           tangent) of y-expr/x-expr in degrees (ie the value\
  256.           returned will be between 0 and 360).\
  257.      log(expr)\
  258.           Returns the natural logarithm of the expression.\
  259.      sqrt(expr)\
  260.           Returns the square root of the expression.\
  261.      rand()\
  262.           Returns a positive random number.  This will usually be\
  263.           used with the modulo or bitwise AND operator to res-\
  264.           trict the range of the result.  For example,\
  265.                   new[x,y] = old[x,y] + rand() % 20 - 10\
  266.           will adjust the brightness levels of each pixel in the\
  267.           old image by a random amount (up to 10 levels brighter\
  268.           or darker).\
  269.      As well as allowing transformation statements, a number of\
  270.      special commands, each starting with a # character, are\
  271.      allowed.  These are described here.\
  272.      #read "filename" [image-name]\
  273.           Read a raw data file into the named image.  If no image\
  274.           name is specified, the name is derived from the base\
  275.           name component of the filename.  If the name already\
  276.           exists, that image is overwritten in memory, otherwise\
  277.           a new image is created.  If the filename does not\
  278.           exist, but the same name with a ".Z" suffix does exist,\
  279.           it is assumed that the file is compressed and the\
  280.           "zcat" program is used to read the compressed image.\
  281.           Note that when the image name defaults to the file\
  282.           name, only the basename (portion after the last '/'\
  283.           character, if any) is used to name the image.  If this\
  284.           resulting name starts with a digit, or contains any\
  285.           characters other than alphabetic, digits and the under-\
  286.           score, you will not be able to reference the image by\
  287.           name, but will have to use the alternative "$n" syntax.\
  288.      #write "filename" [image-name]\
  289.           Write a raw data file from the named image.  The image\
  290.           name is optional, and if not specified, image "old" is\
  291.           used.  If the first character of the filename is `|',\
  292.           the rest of the filename is interpreted as a command to\
  293.           be run, with the raw image data being fed to it as\
  294.           standard input.\
  295.      #list\
  296.           All the named images (other than "old" and "new" are\
  297.           listed).\
  298.      #genps "filename" [image-name]\
  299.           Generate postscript to produce the image.  The image\
  300.           name is optional, and if not specified, image "old" is\
  301.           used.  The image will be scaled to fit whatever paper\
  302.           size is being used.  As with the #write command, if the\
  303.           first character of the filename is a `|' symbol, the\
  304.           rest of the string will be treated as a command to be\
  305.           executed, with the postscript being piped to its stan-\
  306.           dard input.  This is convenient for printing images on\
  307.           a PostScript printer.\
  308.      #undo\
  309.           The old and new images are swapped.  This has the\
  310.           effect of restoring the image that existed before the\
  311.           last transformation.\
  312.      #genepson "filename" [image-name]\
  313.           Generate data for an Epson (or compatible) printer to\
  314.           produce the image.  The image name is optional, and if\
  315.           not specified, image "old" is used.  Under MSDOS, the\
  316.           device name can be used directly (eg "PRN").\
  317.           The existing code is for a 24-pin printer such as the\
  318.           LQ-500.  To generate data for an 8-pin printer requires\
  319.           a couple of minor modifications to function genepson()\
  320.           in file special.c.\
  321.      #undo\
  322.           The old and new images are swapped.  This has the\
  323.           effect of restoring the image that existed before the\
  324.           last transformation.\
  325.      #display image-name\
  326.           The named image will be displayed.  This is the fastest\
  327.           way to display an image, and works regardless of the\
  328.           state of auto-display.\
  329.      #display +\
  330.           Turn auto-display on (equivalent to the command-line\
  331.           option -a+ ).\
  332.      #display -\
  333.           Turn auto-display off (equivalent to the command-line\
  334.           option -a- ).\
  335.      #truncate +\
  336.           All assignments to an image with values outside the\
  337.           range 0 to Z will be truncated to the appropriate boun-\
  338.           dary, instead of wrapping as described in the book.  An\
  339.           example of using this feature would be for a simplistic\
  340.           lightening of an image by adding a constant value.\
  341.           Normally, very white areas would wrap around and become\
  342.           black, but enabling truncation prevents this.\
  343.      #truncate -\
  344.           All assignments to an image will be done modulo (Z+1).\
  345.           This is the default.\
  346.      #verbose +\
  347.           Turn on verbose mode.  Equivalent to the -v+command\
  348.           Certain warning messages will be printed.  This turns\
  349.           on the "percent done" feature of some drivers (on oth-\
  350.           ers it is always active).\
  351.      #truncate\
  352.           Report whether truncation is currently in effect or\
  353.           not.\
  354.      #verbose -\
  355.           Turn off verbose mode.  Equivalent to the -v-command\
  356.      #verbose\
  357.           Report the state of the verbose flag.\
  358.      #logfile +\
  359.           Enable logging on the current log file (default\
  360.           "popi.log").  If logging is already enabled, the file\
  361.           is closed and re-opened with a new timestamp appended.\
  362.      #logfile -\
  363.           Disable logging"\
  364.      #logfile "filename"\
  365.           Enable logging on the specified file.\
  366.           Whenever a log file is opened, it is always opened in\
  367.           append mode, so existing data is never truncated.  Upon\
  368.           opening a log file, a timestamp is written.  All user\
  369.           input is logged, along with error messages and some\
  370.           program responses.\
  371.      #free imagename\
  372.           The memory associated with the named image is freed.\
  373.           Any further access to this image becomes impossible.\
  374.           This command may be useful in situations where memory\
  375.           is very limited, such as a PC.\
  376.      The remaining special commands are used to obtain special\
  377.      built-in transformations, as described in Chapter 6 of\
  378.      "Beyond Photography".  In each of these cases, the image\
  379.      name is optional, and defaults to "old".  In each case\
  380.      (except for #melt), the result is stored in "new", and then\
  381.      "old" and "new" are swapped as usual.  In the case of #melt,\
  382.      the transformation is done in place and no swap occurs.\
  383.      #oil image-name\
  384.      #shear image-name\
  385.      #slice image-name\
  386.      #tile image-name\
  387.      #melt image-name\
  388.      #matte image-name gamma\
  389.           In this case, gamma is an optional floating point\
  390.           number (defaults to 7.5).  See the book for details.\
  391. DIFFERENCES\
  392.      There are a number of differences between the Pico inter-\
  393.      preter, for which the examples in the book are written, and\
  394.      the Popi interpreter as implemented here.\
  395.      Integer evaluation stack.  The current version of the inter-\
  396.      preter has an integer evaluation stack.  For this reason,\
  397.      the sin() and cos() functions, have their results multiplied\
  398.      by Z automatically in order to be significant.  A future\
  399.      version of the interpreter will provide the option for a\
  400.      floating point stack, and a syntax which will handle both\
  401.      cases.\
  402.      Polar coordinates.  In the book, both cartesian and polar\
  403.      coordinates are specified with square brackets.  The deci-\
  404.      sion of whether to interpret the indices as polar or carte-\
  405.      sian is based on context; if the symbols r and a are used in\
  406.      the index expressions, the coordinates are interpreted as\
  407.      polar, otherwise they are interpreted as rectangular.  Thus,\
  408.      in order to use a radius or angle in a cartesian coordinate\
  409.      expression, it must be cast, as is done on page 48 of the\
  410.      book.  By providing a separate syntax for polar and carte-\
  411.      sian coordinate references, the problem never occurs.\
  412. EXAMPLES\
  413.      These examples are mainly taken from the book, with syntax\
  414.      modifications where required.  The images in the book are\
  415.      usually 1000 x 1000 pixels.  To produce the same results on\
  416.      a smaller image, you may need to multiply any occurences of\
  417.      x, y and r by an appropriate scaling factor.  The first\
  418.      example image generation in the book is\
  419.              new[x,y] = x + y  ; page 17 (3.1)\
  420.      which produces a number of diagonal stripes, each fading\
  421.      from black to white.  On a 512 x 512 image, to get the same\
  422.      number of stripes, use the transform\
  423.              new[x,y] = x*2 + y*2\
  424.      A series of ripples can be produced with\
  425.              new[x,y] = (x * y) % (Z + 1)  ; page 18 (3.2)\
  426.      or more simply, because all brightness values are inherently\
  427.      modulo (Z + 1) unless truncation is turned on\
  428.              new[x,y] = x * y\
  429.      A single smooth transition can be accomplished with\
  430.              new[x,y] = (Z * x * y) / ((X-1) * (Y-1))  ; page 18 (3.3)\
  431.      The transformation\
  432.              new[x,y] = x % y\
  433.      is the same as new[x,y] = x when x < 0 (ie in the lower left\
  434.      triangle of the image, with a different effect in the upper\
  435.      right half.\
  436.      The trig functions allow transforms such as\
  437.              new[x,y] = y + sin(x) / 2  ; page 19 (3.5)\
  438.      which produce a series of sine waves (remember that the\
  439.      range of sin(x) is +-Z.\
  440.      An image reminiscent of a radar sweep can be produced by\
  441.              new[x,y] = atan(y - Y/2, x - X/2) * Z / 360  ; page 19 (3.6)\
  442.      The atan() function has a range of 0 .. 360, so the *Z/360\
  443.      rescales to 0 ..  Z. This transform is overall providing an\
  444.      intensity relative to the angle of a point in polar\
  445.      coordinates.  The transform language provides the current\
  446.      angle as the variable a, so this statement can be rewritten\
  447.      as\
  448.              new[x,y] = a * Z / 360\
  449.      Polar coordinates can be used to produce an image which\
  450.      varies from black in the centre to white on the outside\
  451.              new[x,y] = r * Z / R  ; page 21 (3.11)\
  452.      or a spiraling effect\
  453.              new[x,y] = (((a + r) % 16) - 8) * Z / 16 + Z/2  ; page 21 (3.12)\
  454.      The conditional operator can be used to provide a filled\
  455.      black circle\
  456.              new[x,y] = r > R/2 ? 0 : Z\
  457.      or black and white patterns such as\
  458.              new[x,y] = ((x % (5 + y/25)) > 5) ? 0 : Z  ; page 20 (3.9)\
  459.              new[x,y] = (Z * abs(x % sin(y)) > 10) ? 0 : Z  ; page 20 (3.10)\
  460.      We can also modify existing images using these transforms.\
  461.      The previous image can always be referred to as old, or an\
  462.      explicitly named image can be used.  We can read an image\
  463.      (eg of Dennis Ritchie) using\
  464.              #read "dmr"  ; read the image in the file "dmr" and name it dmr.\
  465.      and then use it in a transform, such as\
  466.              new[x,y] = Z - dmr[x,y]  ; page 22 (3.13)\
  467.      This produces a negative, which can be written to a file\
  468.      with\
  469.              #write "dmr_neg"\
  470.      or converted to PostScript and printed with\
  471.              #genps "| lp -dalw"\
  472.      Since the new image built during a transformation becomes\
  473.      the old image of the following transform, the negative image\
  474.      can be re-reversed to produce the original with\
  475.              new[x,y] = Z - old[x,y]  ; reverse the process\
  476.      In the following examples, we will use old in most of the\
  477.      transforms, rather than a particular image name.  In prac-\
  478.      tice, you would probably use a specifically named image\
  479.      instead.\
  480.      Provide a circular frame for an image\
  481.              new[x,y] = r > R/2 ? 0 : old[x,y]\
  482.      A solarisation process, that fades in from left to right\
  483.              new[x,y] = (old[x,y] > (Z*x) / (2 * X)) ? old[x,y] : Z-old[x,y]  ; page 22 (3.16)\
  484.      Generate a relief map\
  485.              new[x,y] = old[x,y] + (Z/2 - old[x+2,y+2])  ; page 24 (3.19)\
  486.      Shrink an image\
  487.              new[x,y] = old[x*2,y*2]  ; page 25 (3.24)\
  488.      An interesting caricature is produced by\
  489.              new[x,y] = old\{sqrt(r * R),a\}  ; page 34\
  490.      Note the use of polar coordinates.  The reverse transform\
  491.      gives a fisheye lens effect:\
  492.              new[x,y] = old\{(r*r)/R, a\}  ; page 60\
  493.      The following transform illustrates how an expression can be\
  494.      used for the indices of the destination matrix.\
  495.              new[x, y-old[x,y]/4] = old[x,y]  ; page 40\
  496.      An image can be swirled about the centre with\
  497.              new[x,y] = old\{r, a + r/3\}\
  498.      The following transform uses polar coordinate values in a\
  499.      cartesian reference, resulting in something that looks like\
  500.      what you'd see in a cylindrical mirror\
  501.              new[x,y] = old[a * X/A, r * Y/R]  ; page 48\
  502.      The image generated by\
  503.              new[x,y] = old\{ (r/16)*16, (a/16)*16 \}  ; page 72\
  504.      is very interesting, in that it is completely unrecognisable\
  505.      when viewed up close, but from a distance of a few metres it\
  506.      will resolve into the original.\
  507.              new[x,y] = old\{r, a + old\{r,a)/8\}  ; page 68\
  508.      This image is a swirl, but with the skew dependant on the\
  509.      brightness of the current point.\
  510.              new[x,y] = x < X/2 ? old[x,y] : old[X-x,y]\
  511.              new[x,y] = x > X/2 ? old[x,y] : old[X-x,y]\
  512.      These transformations do a horizontal mirror reversal about\
  513.      the centre of the image.  Because faces are usually close\
  514.      to, but not exactly, centered, this transform of a face can\
  515.      be interesting.\
  516.              new[x,y] = old[x+(x%32)-16, y]  ; page 58\
  517.              new[x,y] = old[x+((a+r/10)%32)-16, y]\
  518.      These transforms applied to a face produce what looks like\
  519.      someone peering through a bathroom window.\
  520. DRIVERS\
  521.      nulldev\
  522.           The null device driver is mainly for people with no\
  523.           graphics display device for which a driver exists.\
  524.           Using this device, data for a PostScript or Epson\
  525.           printer can still be generated.\
  526.      atariterm\
  527.           The atari driver is for use with "TERM", a multiplexing\
  528.           terminal program for the Atari ST, written by Peter\
  529.           Collinson of the University of Kent at Canterbury.  It\
  530.           is not a driver for running native on an atari.\
  531.      kermit\
  532.           This is a driver for MS-Kermit 2.32 on an IBM PC, which\
  533.           is capable of emulating a Tektronix 4010. This provides\
  534.           three levels of contrast (nothing, normal and bold).\
  535.      MGR  This driver is for the Bell Core MGR window system. It\
  536.           is visually identical to the SunView version, but is\
  537.           currently hardwired to monochrome.\
  538.      NeWS This is the driver that will work with NeWS v1.1 and\
  539.           OpenWindows v1.0.  It is also visually identical to the\
  540.           SunView version.\
  541.      pcturbo\
  542.           This is a driver for running popi native on a PC with\
  543.           Borland's Turbo C compiler.  It uses the graphics\
  544.           library supplied with Turbo C, which auto-detects most\
  545.           types of graphics display.  No attempt at using a\
  546.           colourmap is done - a single display dot is used for\
  547.           each image pixel, with simple dithering.  Only directly\
  548.           accesible memory is used, which drastically restricts\
  549.           the size of images that can be handled.\
  550.      SunView\
  551.           This driver is the initial version to work with the\
  552.           SunView graphics package available on Sun Workstations.\
  553.           There is currently minimal functionality.  The output\
  554.           is in 256 greyscales on colour machines, and an 8x8\
  555.           dither on monochrome screens.\
  556.      X11  A graphics implementation for use with MIT's X11 window\
  557.           system.  This driver is visually identical to the Sun-\
  558.           View version.\
  559.      XView\
  560.           A conversion of the SunView graphics driver to use the\
  561.           XView X11 toolkit. This driver is visually identical to\
  562.           the SunView version.\
  563. SEE ALSO\
  564.      ipscript(1L), imavg(1L).\
  565. AUTHOR\
  566.      Gerald J. Holzmann, AT&T Bell Laboratories, Murray Hill, New\
  567.      Jersey.\
  568.      Modifications and additional functionality, Atari, PC,\
  569.      PostScript, Epson and null drivers by Stephen Frede, Softway\
  570.      Pty Ltd, Australia.\
  571.      Popi maintainance, SunView, X11, NeWS, MGR and XView graph-\
  572.      ics drivers by Rich Burridge, Sun Microsystems, Australia.\
  573.      Kermit graphics driver by Frank Crawford, Q.H. Tours.\
  574.      Amiga graphics driver by Peter Chubb, Softway Pty Ltd, Aus-\
  575.      tralia.\
  576.      Apollo driver by Tim Lambert, University of New South Wales.\
  577. BUGS\
  578.      Functions which require popen() (ie auto reading of\
  579.      compressed files and writing to pipes) don't work in the\
  580.      sequent multiprocessor version.\
  581.      Probably more - please notify richb@sunaus.oz.au of any\
  582.      found.\
  583. CREDITS\
  584.      This implementation is heavily based on version 2.1 of the\
  585.      popi implementation by Rich Burridge & Stephen Frede.\
  586. CHANGES IN CIC\
  587.      All special functions (#...) were removed. No support for \
  588.      multiple images, only old and new exist.\
  589.      In addition to the standard variables the following CIC\
  590.      variables can be used in popi code:\
  591.     - pencilPressure, pencilDX, pencilDY\
  592.     - currentShot, maxShots\
  593.     - select1 - select5, range1 - range5\
  594.      Also, three free variables that can be adjusted by sliders\
  595.      are allowed:\
  596.     - A, B, C\
  597.      The original variable 'A' in popi, which always had a value\
  598.      of 360, has been removed.
  599. Module Info
  600. NXStringTable
  601.     HashTable
  602. moduleName
  603.     TheWindow
  604. Field1
  605.     HelpPanel
  606. Field2
  607. Button2
  608. Alpha
  609. Slider2
  610. VersionNumber
  611. ScrollingText
  612. Field3
  613. Button1
  614. Field
  615. File's Owner
  616. Slider1
  617.     InfoPanel
  618. Form1
  619. Form2
  620. [29@]
  621. IBOutletConnector
  622. IBConnector
  623. actionView
  624. stringTable
  625. IBControlConnector
  626. takeIntValueFrom:
  627. PopiCodeScrollView
  628. PopiErrorTextField
  629. AValueFormCell
  630. BValueFormCell
  631. LimiterButton
  632. CValueFormCell
  633. showPreset:
  634. makeKeyAndOrderFront:
  635. channelMatrix
  636.